package com.hildeberto.home.client;

import com.conseilimmo.bo.util.Convert;
import com.conseilimmo.repository.LocataireBsn;
import com.conseilimmo.repository.LocationBsn;
import com.conseilimmo.repository.PersonneBsn;
import com.conseilimmo.repository.SuiviBsn;
import com.hildeberto.home.util.EntityManagerHelper;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Hyperlink;
import javafx.scene.control.Label;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.util.Callback;
import objetBo.EtatSuivi;
import objetBo.Locataire;
import objetsBd.LocataireBd;
import objetsBd.LocationBd;
import objetsBd.PersonneBd;
import objetsBd.SuiviLoyerBd;

/**
 *
 * @author verpoorten
 */
public class LocationController implements Initializable {

    private LocationBd locationEdition;
    private LocataireBd locataireEnCours;
    private Integer indexLocataire;
    @FXML
    TableView<Locataire> tableLocataires;
    @FXML
    TableColumn<PersonneBd, String> nomCol;
    @FXML
    TableColumn<PersonneBd, String> prenomCol;
    private List<PersonneBd> personnesConnues;
    //
    @FXML
    private TextField txtLocationDateDebut;
    @FXML
    private TextField txtLocationDateFin;
    @FXML
    private TextField txtLocationAdresse;
    @FXML
    private TextField txtBailType;
    @FXML
    private TextField txtBaiDuree;
    @FXML
    private TextField txtBaiJourQuittance;
    @FXML
    private TextField txtBaiRenom;
    @FXML
    private TextField txtBailLoyer;
    @FXML
    private TextField txtBailCharges;
    @FXML
    private TextField txtBailIndexRef;
    @FXML
    private TextField txtBailIndexActuel;
    @FXML
    private TextField txtIdLocation;
    @FXML
    private TextField txtIdLocataire;
    @FXML
    private TextField txtMessageInfo;
    @FXML
    private TextField txtIdPersonne;
    @FXML
    private TextField txtNomProprio;
    @FXML
    private TextField txtAssuranceProprio;
    @FXML
    private TextField txtInfoLocataire;
    @FXML
    private TextArea messageInfo;
    @FXML
    private ComboBox personnesListeCombo;
    //pagination
         @FXML    
     private Label pageTotal;
     @FXML    
     private Label pageCourante;

    //
    private static final Logger LOGGER = Logger.getLogger(AgendaController.class.getName());

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        
        //
        refreshCombo();
        personnesListeCombo.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
            // this method will be called whenever user selected row
            @Override
            public void changed(ObservableValue observale, Object oldValue, Object newValue) {
                PersonneBd selectedUser = (PersonneBd) newValue;
                txtIdPersonne.setText(Convert.convertLongToString(selectedUser.getIdPersonne()));
                LOGGER.log(Level.INFO, "id sel:{0}", selectedUser.getIdPersonne());
            }
        });

    }

    public void refreshCombo() {
        PersonneBsn personneBsn = new PersonneBsn();
        personnesConnues = personneBsn.trouverListePersonnes();
        personnesListeCombo.getItems().clear();
        personnesListeCombo.getItems().addAll(personnesConnues);
    }

    public TextArea getMessageInfo() {
        return messageInfo;
    }

    public void setMessageInfo(TextArea messageInfo) {
        this.messageInfo = messageInfo;
    }

    public LocationBd getLocationEdition() {
        return locationEdition;
    }

    public void changerLocation(LocationBd locationEdition) {
        this.locationEdition = locationEdition;
        LocataireBsn locatairesBsn = new LocataireBsn();
        PersonneBsn personneBsn = new PersonneBsn();
        List<LocataireBd> locataires = locatairesBsn.trouverLocatairesListeParIdLocation(locationEdition.getIdLocation());
        List<Locataire> locatairesPersonnes = new ArrayList<>();
        for (LocataireBd l : locataires) {
            PersonneBd personne = personneBsn.trouverPersonneParId(l.getIdPersonne());
            Locataire loc = new Locataire();
            loc.setEnregistrementLocataire(l);
            loc.setEnregistrementPersonne(personne);
            locatairesPersonnes.add(loc);
        }

        garnirEditionLocation(locationEdition, locatairesPersonnes);
    }

    public void setLocationEdition(LocationBd locationEnCours) {
        this.locationEdition = locationEnCours;
    }

    public List<PersonneBd> getPersonnesConnues() {
        return personnesConnues;
    }

    public void setPersonnesConnues(List<PersonneBd> personnesConnues) {
        this.personnesConnues = personnesConnues;
    }

    public TableView<Locataire> getTableLocataires() {
        return tableLocataires;
    }

    public void setTableLocataires(TableView<Locataire> tableLocataires) {
        this.tableLocataires = tableLocataires;
    }

    @FXML
    private void btnVoirLocataireAction(ActionEvent action) {
        MainApp.getLocataireController().setLocataireEnEdition(locataireEnCours);
    }

    @FXML
    private void btnModifierLocationAction(ActionEvent action) {
    }

    @FXML
    private void btnEnregistrerLocationAction(ActionEvent action) {
        boolean valide = true;
        StringBuilder messageInfo = new StringBuilder();
        txtMessageInfo.setText(null);
        if (locationEdition.getIdLocation() == null) {
            //Ajout
            if (locationEdition.getIdBatiment() == null) {
                messageInfo.append("Il faut un batiment");
                valide = false;
            }

            if (valide) {
                LocataireBsn locataireBsn = new LocataireBsn();
                LocationBsn locationBsn = new LocationBsn();
                LocationBd l = garnirLocation();
                List<LocataireBd> locatairesEncode = garnirListeLocataires();
                l = locationBsn.ajouterLocation(l);
                for (LocataireBd locataireATraiter : locatairesEncode) {
                    if (locataireATraiter.getIdLocataire() == null) {
                        locataireBsn.ajouterLocataire(locataireATraiter);
                    } else {
                        locataireBsn.modifierLocataire(locataireATraiter);
                    }
                }

                /* if (l.getIdLocataire() == null) {
                 //Il faut au moins ajouter un locataire
                 locataire.setIdLocation(l.getIdLocation());
                 } else {

                 locataire = locataireBsn.trouverLocataireParId(l.getIdLocataire());
                 }
                 if (txtIdPersonne.getText() == null || txtIdPersonne.getText().isEmpty()) {
                 //messageInfo.append("Il faut une personne");
                 //valide = false;
                 locataire.setIdPersonne(0L);
                 } else {
                 locataire.setIdPersonne(Convert.convertStringToLong(txtIdPersonne.getText()));
                 }

                 if (locataire.getIdLocataire() == null) {
                 locataireBsn.ajouterLocataire(locataire);
                 } else {
                 locataireBsn.modifierLocataire(locataire);
                 }*/
                /**
                 * Il faut créer les suivis par défaut
                 */
                List<SuiviLoyerBd> suivis=creerSuivisPourLocation(l);
                messageInfo.append("\n");
                messageInfo.append(suivis.size());
                messageInfo.append(" suivi de crée(s)");
            }
        } else {
            //Modification
        }
        txtMessageInfo.setText(messageInfo.toString());
    }

    @FXML
    private void btnAnnulerLocationAction(ActionEvent action) {
    }

    @FXML
    private void btnNouveauLocationAction(ActionEvent action) {
    }

    @FXML
    private void btnSupprimerLocationAction(ActionEvent action) {
    }

    @FXML
    private void btnNouvelleDepenseAction(ActionEvent action) {
    }

    @FXML
    private void btnNouvellePersonneAction(ActionEvent action) {
    }

    @FXML
    private void btnAjouterLocataire(ActionEvent action) {
        if (txtIdPersonne.getText() != null) {
            LOGGER.log(Level.INFO, "On va ajouter la personne {0} comme locataire", txtIdPersonne.getText());
            PersonneBsn personneBsn = new PersonneBsn();
            PersonneBd p = personneBsn.trouverPersonneParId(Convert.convertStringToLong(txtIdPersonne.getText()));
            Locataire l = new Locataire();
            l.setEnregistrementLocataire(null);
            l.setEnregistrementPersonne(p);
            tableLocataires.getItems().add(l);
        }
    }

    public void garnirEditionLocation(LocationBd location, List<Locataire> listeLocataires) {
        System.out.println("garnirEditionLocation");
        if (location != null) {
            LocataireBsn locataireSn = new LocataireBsn();
            PersonneBsn personneBsn = new PersonneBsn();

            locationEdition = location.createClone();
            txtIdLocataire.setText(Convert.convertLongToString(location.getIdLocataire()));
            txtIdLocation.setText(Convert.convertLongToString(location.getIdLocation()));
            txtIdPersonne.setText("Pas de locataire");
            LocataireBd locataireActuel = locataireSn.trouverLocataireParId(location.getIdLocataire());
            if (locataireActuel != null) {
                txtIdPersonne.setText("HICC");

                PersonneBd personneLoc = personneBsn.trouverPersonneParId(locataireActuel.getIdPersonne());
                if (personneLoc != null) {
                    txtIdPersonne.setText("HICC");
                    txtIdPersonne.setText(Convert.convertLongToString(personneLoc.getIdPersonne()));
                }
            } else {
                if (location.getIdLocataire() != null) {
                    txtIdPersonne.setText("z" + location.getIdLocataire());
                    System.out.println("z0" + location.getIdLocataire());
                    LocataireBd l = locataireSn.trouverLocataireParId(location.getIdLocataire());

                }
            }
            txtAssuranceProprio.setText(location.getAssuranceProprioIncendie());
            txtBaiDuree.setText(Convert.convertIntegerToString(location.getBailDuree()));
            txtBaiJourQuittance.setText(Convert.convertIntegerToString(location.getBailJourQuittance()));
            txtBaiRenom.setText(location.getBailRenom());
            txtBailCharges.setText(Convert.convertDoubleToString(location.getBailCharges()));
            txtBailIndexActuel.setText(Convert.convertDoubleToString(location.getIndexActuel()));
            txtBailIndexRef.setText(Convert.convertDoubleToString(location.getIndexRef()));
            txtBailLoyer.setText(Convert.convertDoubleToString(location.getBailLoyer()));
            txtBailType.setText(location.getBailType());
            txtNomProprio.setText(location.getNomProprio());
            if (location.getBailDateDebut() != null) {
                txtLocationDateDebut.setText(Convert.convertDateToString(location.getBailDateDebut()));

            }
            if (location.getBailDateFin() != null) {
                txtLocationDateFin.setText(Convert.convertDateToString(location.getBailDateFin()));

            }
            EntityManagerHelper.EM.close();
        } else {
            locationEdition = new LocationBd();
            txtLocationDateDebut.setText("");
            txtLocationDateFin.setText("");
        }
        tableLocataires.getItems().setAll(listeLocataires);
        indexLocataire=0;
        if(listeLocataires!=null && !listeLocataires.isEmpty()){
            locataireEnCours=listeLocataires.get(indexLocataire).getEnregistrementLocataire();
        }
    }

    private LocationBd garnirLocation() {
        LocationBd l = new LocationBd();
        if (txtLocationDateDebut.getText() != null && !txtLocationDateDebut.getText().trim().isEmpty()) {
            l.setBailDateDebut(Convert.convertStringToDate(txtLocationDateDebut.getText()));
        }
        if (txtLocationDateFin.getText() != null && !txtLocationDateFin.getText().trim().isEmpty()) {
            l.setBailDateFin(Convert.convertStringToDate(txtLocationDateFin.getText()));
        }
        l.setAssuranceProprioIncendie(txtAssuranceProprio.getText());

        l.setBailDuree(Convert.convertStringToInteger(txtBaiDuree.getText()));
        l.setBailJourQuittance(Convert.convertStringToInteger(txtBaiJourQuittance.getText()));
        l.setBailRenom(txtBaiRenom.getText());
        l.setBailCharges(Convert.convertStringToDouble(txtBailCharges.getText()));
        l.setIndexActuel(Convert.convertStringToDouble(txtBailIndexActuel.getText()));
        l.setIndexRef(Convert.convertStringToDouble(txtBailIndexRef.getText()));
        l.setBailLoyer(Convert.convertStringToDouble(txtBailLoyer.getText()));
        l.setBailType(txtBailType.getText());
        l.setNomProprio(txtNomProprio.getText());

        l.setDateDeModif(new Date());

        return l;
    }

    private List<LocataireBd> garnirListeLocataires() {
        List<LocataireBd> locataires = new ArrayList<>();
        for (Locataire l : tableLocataires.getItems()) {
            LocataireBd ll = l.getEnregistrementLocataire();
            if (l.getEnregistrementPersonne() != null) {
                ll.setIdPersonne(l.getEnregistrementPersonne().getIdPersonne());
            } else {
                ll.setIdPersonne(0L);//Indéfini
            }
        }
        return locataires;
    }

    private  List<SuiviLoyerBd> creerSuivisPourLocation(LocationBd location) {
        Calendar dateDebut = new GregorianCalendar();
        dateDebut.setTime(location.getBailDateDebut());
        Calendar dateFin = new GregorianCalendar();
        dateFin.setTime(location.getBailDateFin());
        Calendar dateTravail = new GregorianCalendar();
        dateTravail.setTime(location.getBailDateDebut());

        Calendar calendar = new GregorianCalendar();
        SuiviBsn suiviBsn = new SuiviBsn();
        List<SuiviLoyerBd> suivis=new ArrayList<>();
        while (dateTravail.before(dateFin)) {
            SuiviLoyerBd suivi1 = new SuiviLoyerBd();
            suivi1.setIdLocation(location.getIdLocation());
            suivi1.setIdSuivi(null);
            calendar.setTime(dateTravail.getTime());
            suivi1.setDateLoyerAttendu(calendar.getTime());
            suivi1.setEtatLoyer(EtatSuivi.A_VERIFIER.getNumEtatSuivi());
            suivi1=suiviBsn.ajouterSuivi(suivi1);
suivis.add(suivi1);
            dateTravail.add(Calendar.MONTH, 1);

        }
        return suivis;
    }

    public Label getPageTotal() {
        return pageTotal;
    }

    public void setPageTotal(Label pageTotal) {
        this.pageTotal = pageTotal;
    }

    public Label getPageCourante() {
        return pageCourante;
    }

    public void setPageCourante(Label pageCourante) {
        this.pageCourante = pageCourante;
    }

    public LocataireBd getLocataireEnCours() {
        return locataireEnCours;
    }

    public void setLocataireEnCours(LocataireBd locataireEnCours) {
        this.locataireEnCours = locataireEnCours;
    }

    public Integer getIndexLocataire() {
        return indexLocataire;
    }

    public void setIndexLocataire(Integer indexLocataire) {
        this.indexLocataire = indexLocataire;
    }
    
       @FXML
    private void btnPrecedenAction(ActionEvent action) {
    
        
    }
    @FXML
    private void btnSuivantAction(ActionEvent action) {
    
        
    }

}
